package com.zeyu.soc.log.provider;

import java.util.ServiceLoader;

import com.zeyu.soc.log.exception.NoTransformHandlerFoundException;
import com.zeyu.soc.log.spi.TransformDescriptor;
import com.zeyu.soc.log.spi.TransformHandler;

public class TransformHandlerProvider {

	// ================================================================
	// Constants
	// ================================================================

	// ================================================================
	// Fields
	// ================================================================

	private static ServiceLoader<TransformHandler> serviceLoader = ServiceLoader.load(TransformHandler.class);

	// ================================================================
	// Constructors
	// ================================================================

	// ================================================================
	// Methods from/for super Interfaces or SuperClass
	// ================================================================

	// ================================================================
	// Public or Protected Methods
	// ================================================================

	public static TransformHandler getProvider(TransformDescriptor injectDescriptor) {
		try {
			for (TransformHandler handler : serviceLoader) {
				try {
					if (handler.canHandler(injectDescriptor)) {
						return handler;
					}
				} catch (Exception e) {
				}
			}
		} catch (Throwable e) {
			e.printStackTrace();
		}
		System.out.println("no TransformHandler Found ,please check the META-INF/services");
		throw new NoTransformHandlerFoundException("no TransformHandler Found ,please check the META-INF/services");
	}

	// ================================================================
	// Getter & Setter
	// ================================================================

	// ================================================================
	// Private Methods
	// ================================================================

	// ================================================================
	// Inner or Anonymous Class
	// ================================================================

	// ================================================================
	// Test Methods
	// ================================================================
}
